{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1jaemmsUi8TnrK6so6pvvDG6e666QIng2?usp=sharing)\n"
      ],
      "metadata": {
        "id": "03GPOrjb8FJ1"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Get structured outputs from 100+ LLMs"
      ],
      "metadata": {
        "id": "QUvn05wUXBbA"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "[**Instructor**](https://github.com/jxnl/instructor) is a Python library for getting structured outputs from LLMs. Built on top of Pydantic, it provides a simple, transparent, and user-friendly API to manage validation, retries, and streaming responses.\n",
        "\n",
        "<br>\n",
        "\n",
        "**Portkey** is an open source [**AI Gateway**](https://github.com/Portkey-AI/gateway) that helps you manage access to 250+ LLMs through a unified API while providing visibility into\n",
        "\n",
        "✅ cost  \n",
        "✅ performance  \n",
        "✅ accuracy metrics\n",
        "\n",
        "This notebook demonstrates how you can get structured outputs from 100s of LLMs using Portkey's AI Gateway."
      ],
      "metadata": {
        "id": "YhM8C8VDXG2Y"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "uQLdtnFhWbIE",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "b0e43ab5-fd2a-443b-a5e2-e10383289e9a"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m53.1/53.1 kB\u001b[0m \u001b[31m1.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m405.9/405.9 kB\u001b[0m \u001b[31m5.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m328.3/328.3 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m327.6/327.6 kB\u001b[0m \u001b[31m10.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.6/75.6 kB\u001b[0m \u001b[31m1.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.7/12.7 MB\u001b[0m \u001b[31m20.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.9/77.9 kB\u001b[0m \u001b[31m3.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m1.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h"
          ]
        }
      ],
      "source": [
        "!pip install -qU instructor portkey-ai openai jsonref"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Structured Outputs for OpenAI models"
      ],
      "metadata": {
        "id": "80K8rNtgdvyy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import instructor\n",
        "from pydantic import BaseModel\n",
        "from portkey_ai import Portkey\n",
        "from openai import OpenAI\n",
        "from google.colab import userdata\n",
        "from portkey_ai import PORTKEY_GATEWAY_URL, createHeaders\n",
        "\n",
        "portkey = OpenAI(\n",
        "    base_url=PORTKEY_GATEWAY_URL,\n",
        "    api_key = \"X\",\n",
        "    default_headers=createHeaders(\n",
        "        virtual_key= \"open-ai-key-fb040b\",\n",
        "        api_key=userdata.get('PORTKEY_API_KEY')\n",
        "\n",
        "    )\n",
        ")\n",
        "\n",
        "class User(BaseModel):\n",
        "    name: str\n",
        "    age: int\n",
        "\n",
        "client = instructor.from_openai(portkey)\n",
        "\n",
        "user_info = client.chat.completions.create(\n",
        "    model=\"gpt-3.5-turbo\",\n",
        "    max_tokens=1024,\n",
        "    response_model=User,\n",
        "    messages=[{\"role\": \"user\", \"content\": \"John Doe is 30 years old.\"}],\n",
        ")\n",
        "\n",
        "print(user_info.name)\n",
        "print(user_info.age)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VxjMXaS1cgiY",
        "outputId": "9506a983-aa2d-4c01-c4f4-4a4b7d07cc40"
      },
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "John Doe\n",
            "30\n"
          ]
        }
      ]
    }
  ]
}
